// 项目将会用到的外部链接的 Domain 清单
const domains = [
  'www.googletagmanager.com',
  'accounts.google.com'
]

const replace = match => {
  switch (match) {
    case '/': return '_'
    case '?': return '__'
    case '&': return '___'
    case '=': return '____'
    default:  return match
  }
}

// 代理然后重新定义原有的程序行为
const hacker = {
  // 拦截方法调用
  apply: (target, thisArg, args) => {
    // args[0] 是要插入的节点
    const insertedNode = args[0]

    // 检查插入的节点是否是 script 元素
    if (insertedNode.tagName === 'SCRIPT') {
      const src = insertedNode.src

      // 创建一个 URL 对象以方便处理
      const url = new URL(src)

      // 检查是否包含在域名清单中
      const hackOrNot = domains.some(domain => url.hostname.includes(domain))

      if (hackOrNot) {
        console.debug('原始的url', insertedNode.src)
        // 将协议和域名替换为相对路径
        insertedNode.src =
          `./3rd/${ url.hostname }/` +
          `${ (url.pathname + url.search + url.hash).replace(/[\/?&=]/g, replace) }` +
          `.js`
        console.debug('改写后的url', insertedNode.src)
      }
    }

    return Reflect.apply(target, thisArg, args)
  }
}

// 被改写代码的方法清单
document.head.appendChild   = new Proxy(document.head.appendChild,   hacker)
Node.prototype.insertBefore = new Proxy(Node.prototype.insertBefore, hacker)
